#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include "carte.h"
#include "listecartetransaction.h"
#include "pion.h"

/**
@brief Cette fonction définit le module listecarte
@author MARLIER Molly & GUESDON Marine
@version 1.0
@date 2013/03/26
*/

/**
@brief InitialiserListe permet d'initialiser la liste pour qu'elle soit vide.
@param [in] l: pointeur sur liste.
@return none.
*/
void initialiserListeT(ListeTransaction * l)
{
    l->prem=NULL;
    l->last=NULL;
}

/**
@brief ImplementeListeT permet de remplir la pioche transaction avec les cartes transactions que nous avons choisi.
@param [in] l: pointeur sur liste.
@return none.
*/
void ImplementeListeT (ListeTransaction *l)
{
    initialiserListeT(l);
    CarteTransaction temp;
    InitCarteT (&temp, 21, -600, 1650);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 22, -450, 1200);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 23, -3300, 4800);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 24, -600, 1650);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 25, -850, 1550);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 26, -2500, 3700);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 27, -4500, 7600);
    AjouterEnTeteListeT(temp ,l);
    InitCarteT (&temp, 28, -500, 1600);
    AjouterEnTeteListeT(temp ,l);
}

/**
@brief AjouterEnTeteListe aoute une carte en tête de la liste.
@param [in] l: pointeur sur liste, [in] c:Carte.
@return none.
*/
/* Precondition : l et e initialises et manipules uniquement a travers les operations de leurs modules respectifs*/
void AjouterEnTeteListeT(CarteTransaction c,ListeTransaction * l)
{
    CelluleTransaction *temp;
    temp=l->prem;
    l->prem= (CelluleTransaction*)malloc(sizeof(CelluleTransaction));
    l->prem->info=c;
    l->prem->precedent=NULL;
    if(l->last==NULL)
    {
        l->last=l->prem;
        l->prem->suivant=NULL;
    }
    else
    {
        l->prem->suivant=temp;
        temp->precedent=l->prem;
    }
}


/**
@brief AjouterEnQueueListe ajoute une carte en queue de liste.
@param [in] l: pointeur sur liste, [in] c:Carte.
@return none.
*/
void AjouterEnQueueListeT(CarteTransaction e, ListeTransaction * l) {
CelluleTransaction* temp ;
temp=(CelluleTransaction*) malloc (sizeof (CelluleTransaction)) ;
temp->info=e ;
temp->suivant=NULL ;
temp->precedent=l->last ;
if(EstVideListeC(l))
    {l->prem=temp ;}
else {l->last->suivant=temp ;}
l->last=temp ;}

/**
@brief EstVideListe permet de teste si la liste est vide: renvoi 1 si elle l'est 0 sinon
@param [in,out] l: pointeur sur liste,
@return int
*/
int EstVideListeT(const ListeTransaction * l)
/* Precondition : l prealablement initialisee et manipulee uniquement
                  a travers les operations du module
   Resultat : 1 si l est vide, 0 sinon */
{
    int i;
    if ((l->prem== NULL) && (l->last==NULL))
        {
            i=1;
        }
    else
        {
            i=0;
        }
    return i;
}

/**
@brief SupprimerTeteListe supprime le premier élément dde la liste
@param [in] l: pointeur sur liste
@return none.
*/
/* Precondition : l n'est pas vide*/
void SupprimerTeteListeT(ListeTransaction * l)
{
    assert (EstVideListeT(l)==0);
    CelluleTransaction *temp1;
    CelluleTransaction *temp2;
    temp1=l->prem;
    if(l->last == temp1)
    {
        l->last=NULL;
        l->prem=NULL;
    }
    else
    {
        temp2=temp1->suivant;
        l->prem=temp2;
        temp2->precedent=NULL;
    }
    free(temp1);
}

/**
@brief RecupererPremiereCarte permet de piocher la première carte du paquet
@param [in] l: pointeur sur liste
@return Carte
*/
CarteTransaction RecupererPremiereCarteT (ListeTransaction *l)
{
    assert (EstVideListeT(l)==0);

    CarteTransaction ValeurCarte;
    ValeurCarte=l->prem->info;
    SupprimerTeteListeT(l);
    return ValeurCarte;

}
